package cn.hls.dao;

import java.io.Serializable;
import java.util.List;

import cn.hls.entity.vo.PageInfo;

/**
 * @fileName: City.java
 * @descrption: Dao基类接口
 * @author : yinghui.zhang
 * @Email: uuhui@163.com
 * @date 2015-4-7
 * @version 1.0
 */
public interface BaseDao<T> {
	/**
	 * 持久化实例对象
	 * 
	 * @param entity
	 *            实体类
	 * @return boolean
	 */
	boolean add(T entity)throws Exception;

	/**
	 * 修改实例对象并持久化对象
	 * 
	 * @param entity
	 *            实体类
	 * @return boolean
	 */
	boolean update(T entity)throws Exception;

	/**
	 * 根据实例化对象的编号删除实例
	 * 
	 * @param entityId
	 *            对象编号
	 * @param clazz
	 *            类对象
	 */
	@SuppressWarnings("rawtypes")
	void delete(Object entityId, Class clazz)throws Exception;

	/**
	 * 根据编号删除实例对象
	 * 
	 * @param entityId编号
	 * @throws Exception  异常
	 */
	void delete(Object entityId) throws Exception;

	/**
	 * 根据编号批量删除数据 entityIds 对象编号
	 */
	@SuppressWarnings("rawtypes")
	void delete(Object[] entityIds, Class clazz)throws Exception;
	/**
	 * 根据对象的编号查询实体信息
	 * 
	 * @param entityId
	 *            实例化编号
	 * @return T
	 */
	T find(Serializable entityId)throws Exception;

	/**
	 * 根据对象的编号查询实体信息
	 * 
	 * @param id
	 *            实例化编号
	 * @param clazz
	 *            实例的类
	 * @return T
	 */
	@SuppressWarnings("rawtypes")
	T find(Serializable id, Class clazz)throws Exception;

	/**
	 * 根据查询条件分页查询数据
	 * 
	 * @param listhql
	 *            查询数据集合sql
	 * @param counthql
	 *            查询总数hql
	 * @param objects
	 *            查询参数
	 * @param page
	 *            分页实例信息
	 * @return PageInfo分页信息
	 */
	PageInfo<T> find(String listhql, String countHql, Object[] objects, PageInfo<T> page)throws Exception;

	/**
	 * 
	 * @param hql 查询hql语句
	 * @param params 查询参数
	 * @return List<Object>
	 * @throws Exception 访问数据库异常
	 */
	Object find(String hql, Object[] params)throws Exception;
	/**
	 * 根据查询条件查询数据
	 * 
	 * @param hql
	 *            hql查询语句
	 * @param params
	 *            查询参数
	 * @return
	 */
	List<T> findByHql(String hql, Object[] params)throws Exception;

	/**
	 * 根据查询条件查询数据,将存储在缓存中
	 * 
	 * @param hql
	 *            hql查询语句
	 * @param params
	 *            查询参数
	 * @return
	 */
	List<T> findByHqlWithCache(String hql, Object[] params)throws Exception;

	/**
	 * 根据hql语句更新数据数据
	 * 
	 * @param hql
	 *            hql更新语句
	 * @param params
	 *            更新参数
	 * @return int
	 */
	int executeHQLUpdate(String hql, Object[] params)throws Exception;

	/**
	 * 根据hql语句更新数据数据
	 * 
	 * @param hql
	 *            hql更新语句
	 * @return int
	 */
	int executeUpdate(String hql)throws Exception;

	/**
	 * 根据hql语句查询汇总数
	 * 
	 * @param hql
	 *            汇总hql语句
	 * @param params
	 *            查询参数
	 * @return long
	 */
	Long countByHql(String hql, Object[] params)throws Exception;

	/**
	 * 根据sql语句查询数据
	 * 
	 * @param sql
	 *            sql查询语句
	 * @return List<T>
	 */
	List<T> executeSQLQuery(String sql)throws Exception;

	/**
	 * 根据sql语句查询数据
	 * 
	 * @param sql
	 *            sql查询语句
	 * @param params
	 *            查询参数
	 * @return List<T>
	 */
	List<T> executeSQLQuery(String sql, Object[] params)throws Exception;
	/**
	 * 获取自定义的年月日序列号的值
	 * @return Long
	 * @throws Exception
	 */
	 Long getCustomerId()throws Exception;

}
